package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Causa;

public class CausaDAO {

    private String query;

    public void add(Causa entity, String usuario) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "INSERT INTO sil_causas_flujo (cafl_clave,"
                    + "                cafl_descripcion,"
                    + "                cafl_desc_corta,"
                    + "                cafl_tipo_causa,"
                    + "                cafl_usuario_creo,"
                    + "                cafl_fecha_creo) "
                    + "VALUES('" + entity.getClave()
                    + "','" + entity.getDescripcion()
                    + "','" + entity.getDescripcionCorta()
                    + "','" + entity.getTipo()
                    + "','" + usuario
                    + "', SYSDATE)";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error CADA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error CADA-SQL " + ex.getMessage());
            }
        }
    }

    public void deleteWhere(String condition) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "DELETE sil_causas_flujo \n"
                    + "WHERE  " + condition;
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error CADD-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error CADD-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Causa entity, String usuario) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "UPDATE sil_causas_flujo \n"
                    + "SET    cafl_descripcion    = '" + entity.getDescripcion() + "', \n"
                    + "       cafl_desc_corta     = '" + entity.getDescripcionCorta() + "', \n"
                    + "       cafl_tipo_causa     = '" + entity.getTipo() + "', \n"
                    + "       cafl_usuario_modif  = '" + usuario + "', \n"
                    + "       cafl_fecha_modif    = SYSDATE \n"
                    + "WHERE  cafl_clave          = '" + entity.getClave() + "'";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error CADU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error CADU-SQL " + ex.getMessage());
            }
        }
    }

    protected List<Causa> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Causa> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Causa>();
            while (resultado.next()) {
                Causa causa = new Causa();
                causa.setClave(resultado.getString("clave"));
                causa.setTipo(resultado.getString("tipo"));
                causa.setDescripcion(resultado.getString("descripcion"));
                causa.setDescripcionCorta(resultado.getString("descripcion_corta") == null
                        ? ""
                        : resultado.getString("descripcion_corta"));
                resultados.add(causa);
            }
        } catch (SQLException ex) {
            throw new DAOException("Error CADS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error CADS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Causa> selectAll() throws DAOException {
        query = ("SELECT cafl_clave       AS clave, \n"
                + "       cafl_tipo_causa  AS tipo, \n"
                + "       cafl_descripcion AS descripcion, \n"
                + "       cafl_desc_corta  AS descripcion_corta \n"
                + "FROM   sil_causas_flujo \n"
                + " ORDER BY 1");
        return select();
    }

    public List<Causa> selectWhere(String condition) throws DAOException {
        query = ("SELECT cafl_clave       AS clave, \n"
                + "       cafl_tipo_causa  AS tipo, \n"
                + "       cafl_descripcion AS descripcion, \n"
                + "       cafl_desc_corta  AS descripcion_corta \n"
                + "FROM   sil_causas_flujo \n"
                + "WHERE  " + condition
                + " ORDER BY 1");
        return select();
    }
}
